package com.billsystem.controller;

import com.billsystem.pojo.User;
import com.billsystem.service.UserService;
import com.billsystem.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
public class UserController {

    @Autowired
    private UserService userService;
    /*
    HttpSession 是 Java Servlet 规范里的一个接口，代表着服务器与客户端之间的一次会话。
    在 Web 应用里，当客户端首次访问服务器时，服务器会为该客户端创建一个 HttpSession 对象，
    并且为其分配一个唯一的会话 ID。后续客户端的每次请求都会携带这个会话 ID，
    服务器就能依据会话 ID 找到对应的 HttpSession 对象，进而实现会话状态的管理。
     */
    @Autowired
    private HttpSession session;
    /*
    注册用户
     */
    @PostMapping("insertUser")
    public String insertUser(@RequestBody User user){
        try {
            /*
            查询数据库中是否有同用户名的账户
             */
            User bean = userService.queryUserByName(user.getName());
            if(bean != null){
                return "exist";
            }else{
                userService.insertUser(user);
                return "ok";
            }
        }catch (Exception e){
            e.printStackTrace();
            return "error";
        }
    }
    /*
    用户登陆功能
     */
    @PostMapping("validateUser")
    public Object validateUser(@RequestBody User user, HttpSession session){
        try{
            //通过用户名获取用户信息
            User bean = userService.queryUserByName(user.getName());
            //如果用户名信息为空，返回不存在
            if(bean == null){
                return "noExist";
            }else{
                //该用户名对应的用户信息存在
                //如果数据库中的用户密码和传入的用户密码一致
                if(bean.getPassword().equals(user.getPassword())){
                    //将用户的 ID（bean.getId()）存储在会话中，键名为 "userId"。这样在后续的请求中，可以通过会话获取当前用户的 ID
                    session.setAttribute("userId",bean.getId());
                    return Result.success();
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return "error";
        }
        return "error";
    }
    /*
    更新用户信息
     */
    @PutMapping("updateUser")
    public Object updateUser(@RequestBody User user){
        try{
            userService.update(user);
            return Result.success().setMessage("个人信息更新成功,请重新登陆");
        }catch (Exception e){
            e.printStackTrace();
            return Result.fail("error");
        }
    }
    /*
    退出登陆
     */
    @GetMapping("/quit")
    public Object quit(HttpSession session){
        try{
            //移除userId的信息
            session.removeAttribute("userId");
            return Result.success();
        }catch (Exception e){
            e.printStackTrace();
            return Result.fail("error");
        }
    }
    /*
    将配置文件中的路径注入给uploadPath
     */
    @Value("${user.path}")
    private String uploadPath;
    /*
    头像的上传
     */
    @PostMapping("/upload")
    public Object uploadImage(@RequestParam(value="file",required=false) MultipartFile file) {
        try {
            // 获取文件名
            String originalFilename = file.getOriginalFilename();
            //文件的后缀名
            String suffix = null;
            if (originalFilename != null) {
                suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            //使用UUID重新生成文件名，防止文件被覆盖
            String fileName = UUID.randomUUID() + suffix;
            //创建一个目录对象
            File dir = new File(uploadPath);
            //判断文件是否存在
            if (!dir.exists()) {
                dir.mkdirs();
            }
            // 指定保存路径
            String filePath = uploadPath + "/" + fileName;
            // 保存文件到本地
            file.transferTo(new File(filePath));
            // 更新用户数据库
            int id = (int) session.getAttribute("userId");
            userService.updateUserImg(fileName, id);
            return Result.success(fileName).setMessage("头像更新成功");
        } catch (IOException e) {
            e.printStackTrace();
            return Result.fail("error");
        }
    }

}
